/**
 * 单链表
 * */
#include <stdio.h>
#include <stdlib.h>

#define ElemType int

typedef struct LNode{
	ElemType data;
	struct LNode* next;
}LNode, *LinkList;

//头插法建立单链表
LinkList List_Head_Insert(LinkList& L);

//尾插法建立单链表
LinkList List_End_Insert(LinkList& L);

//按序号查找指针
LNode* GetElem(LinkList& L, int i);

//按值查找表结点
LNode* LocateElem(LinkList& L, ElemType e);

//插入结点
LinkList List_Insert(LinkList& L, int i, int e);

//删除结点操作
LinkList List_Delete(LinkList& L, int i);

//求单链表长度
int List_Length(LinkList& L);

int main()
{

	return 0;
}

LinkList List_Head_Insert(LinkList& L)
{
	LNode* s; int x;
	L=(LNode* )malloc(sizeof(LNode));	//创建头结点
	L->next=NULL;						//初始为空链表
	scanf("%d", &x);
	while(x != 99) {
		s=(LNode* )malloc(sizeof(LNode));//创建新结点
		s->data=x;	
		s->next=L->next;		//新结点的下一个指针域指向头结点的指针域
		L->next=s;				//头结点的下一个指针域指向新结点
		scanf("%d", &x);
	}
	return L;
}

LinkList List_End_Insert(LinkList& L)
{
	int x;
	L=(LNode* )malloc(sizeof(LNode));
	LNode* s, *r=L;	//指针r为表尾指针
	scanf("%d", &x);
	while(x!=99) {
		s=(LNode* )malloc(sizeof(LNode));
		s->data=x;
		r->next=s;
		r=s;		//r指向新的表尾指针
		scanf("%d", &x);
	}
	r->next=NULL;	//尾结点置空
	return L;
}

LNode* GetElem(LinkList& L, int i)
{
	//判断序号是否合法
	if(i < 1) return NULL;
	int j=1;
	LNode* p=L->next;
	while(p && j < i) {
		p=p->next;
		j++;
	}
	return p;
}

LNode* LocateElem(LinkList& L, ElemType e)
{
	LNode* p=L->next;
	while(p && p->data != e) p=p->next;	//从第一个结点查找data域为e的结点
	return p;
}

LinkList List_Insert(LinkList& L, int i, int e)
{
	LNode* p = GetElem(L, i-1);	//获取要插入结点位置的前驱结点
	LNode* s = (LNode* )malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	return L;
}

LinkList List_Delete(LinkList& L, int i)
{
	LNode* p = GetElem(L, i-1);	//找到要删除结点的前驱结点
	LNode* q = p->next;	//q为要删除的结点
	p->next = q->next;	//将*q结点从链中断开
	free(q);			//释放结点的存储空间
	return L;
}

int List_Length(LinkList& L)
{
	LNode* p = L->next;
	int count = 0;
	while(p) {
		count++;
		p = p->next;
	}
	return count;
}